package com.axon.base.helpers
{
	import flash.xml.XMLDocument;
	
	import mx.collections.ArrayCollection;
	import mx.rpc.xml.SimpleXMLDecoder;
	import mx.utils.ObjectUtil;
	import mx.utils.StringUtil;
	
	public class AxUtils
	{

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static const MILLISECONDS_PER_MINUTE	: int	= 1000 * 60;
		public static const MILLISECONDS_PER_HOUR	: int	= 1000 * 60 * 60;
		public static const MILLISECONDS_PER_DAY	: int	= 1000 * 60 * 60 * 24;

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function currentDate(fromTheServer: Boolean = true): Date
		{
			var result: Date = new Date();
			
			return result;					
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function shortDateFormat(): String
		{
			return "DD.MM.YYYY";
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function intToString(value: int, size: int = 1): String
		{
			var result: String = "";
			
			result = value.toString();
			
			while (result.length < size)
				result = "0" + result;

			return result;					
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function stringToInt(value: String, valueDefault: Number = -1, raiseExceptionIfFail: Boolean = false): int
		{
			var result: int = valueDefault;
			
			if (isNaN(parseInt(value))) {
				result = int(valueDefault);
			} else {
				result = int(value);
			}
			return result;					
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function axUpperCase(value: String): String
		{
			return value.toUpperCase();
		}
		

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function xmlToObject(xml: XML): Object
		{
            var xmlDoc		: XMLDocument		= new XMLDocument(xml.toString());
            var decoder		: SimpleXMLDecoder	= new SimpleXMLDecoder(true);
            var resultObj	: Object			= decoder.decodeXML(xmlDoc);
            
            return resultObj;
  		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function objectToXML(obj : Object, name : String = null) : XML
		{
			var result	: XML;
			var info	: Object = ObjectUtil.getClassInfo(obj);
			
			if(name == null)
				name = AxReflectionUtils.getClassNameByInstance(obj);
				
			name = name.charAt(0).toLowerCase() + name.substring(1);
				
			result = new XML("<" + name + "></"+ name + ">");
			
			for each (var qn : QName in info.properties) {
				
				var val : Object = obj[qn.toString()];
				
				if ( ObjectUtil.isSimple(val) )
					result[qn.toString()] = val;
				else
					result.appendChild(objectToXML(val,qn.toString()));
			}
			return result;			
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function xmlToArrayCollection(xml: XML): ArrayCollection
		{
            var temp		: String 			= "<items>" + xml.toString() + "</items>";
            
            xml = XML(temp);
            
            var xmlDoc		: XMLDocument		= new XMLDocument(xml.toString());
            var decoder		: SimpleXMLDecoder	= new SimpleXMLDecoder(true);
            var resultObj	: Object			= decoder.decodeXML(xmlDoc);
            var ac			: ArrayCollection;
            
            ac = new ArrayCollection();
            
            ac.addItem(resultObj.items);
            
            return ac;
  		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function booleanToString(value: Boolean, strIfFalse: String = null): String
		{
			return value ? "Sim" : strIfFalse ? strIfFalse : "Não";
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function upperCaseFirst(string:String):String 
		{
			return string.charAt(0).toUpperCase() + string.slice(1);
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function lowerCaseFirst(string: String): String 
		{
      		return string.charAt(0).toLowerCase() + string.slice(1);
    	}
    
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function toCamelCase(string: String): String 
		{
			return string.replace(/_[a-z]/g, function x(): String {
        		return (arguments[0] as String).slice(1).toUpperCase();
      		});      
    	}
    
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function toSnakeCase(string:String):String {
			return lowerCaseFirst(string).replace(/[A-Z]/g, function x():String {
				return "_" + (arguments[0] as String).toLowerCase();
			});
		}
    
	}
}